/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package medico;

import classi.utente;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author ren
 */
@WebServlet(name = "ConfermaGenPDF", urlPatterns = {"/ConfermaGenPDF"})
public class ConfermaGenPDF extends HttpServlet {
     /*contiene gli id dei pazienti selezionati*/
    private String[] id_pazienti = null;
    private Connection con;
    private HttpSession sessione;
    
    
    /** 
     * Cambia formato ad una data in formato stringa
     * nel database vengono memorizzate in maniera differente da come vogliamo
     * siano visualizzate.
     * 
     * @param data_convertire Data da convertire in formato stringa. es "02/06/2011"
     * @param patternOld pattern data da convertire. es "dd'/'MM'/'yyyy"
     * @param patterNew nuovo pattern data. es "yyyy'-'MM'-'dd"
     * @return stringa formattata secondo patterNew
     */
    private String cambiaPatternData(String data_convertire, String patternOld, String patterNew) {
        String res = "";
        SimpleDateFormat data = new SimpleDateFormat(patternOld);
        SimpleDateFormat finale = new SimpleDateFormat(patterNew);
        java.sql.Date d = null;
        try {
            d = new java.sql.Date(data.parse(data_convertire).getTime());
        } catch (ParseException ex) {
            Logger.getLogger(ConfermaGenPDF.class.getName()).log(Level.SEVERE, null, ex);
        }
        res = finale.format(d.getTime());
        return res;
    }
    
    /*
     * Ritorna una stringa contenente nome e cognome , corrispondente ad un dato id nel database
     */

    private String get_nome_cognome(String id) {
        String res = "";
        try {
            String comand = "select nome, cognome from Persone where id =" + id;
            Statement st = (Statement) con.createStatement();
            ResultSet rs = (ResultSet) st.executeQuery(comand);
            rs.next();

            res = rs.getString("nome") + " " + rs.getString("cognome");
        } catch (SQLException ex) {
            Logger.getLogger(ConfermaGenPDF.class.getName()).log(Level.SEVERE, null, ex);
        }

        return res;
    }

    /*
     * Ritorna una linked list contenente le date delle ultime vaccinazioni corrispondendi all'id
     * di una persona
     */
    private LinkedList get_lista_vaccini(String id) {

        LinkedList res = new LinkedList();
        try {
            
            String comand = "select data_vaccinazione from vaccinazioni where id_paziente=\"" + id + "\" order by data_vaccinazione desc";
            Statement st = (Statement) con.createStatement();
            ResultSet rs = (ResultSet) st.executeQuery(comand);
            while (rs.next()) {
                res.add(cambiaPatternData(rs.getString(1), "yyyy'-'MM'-'dd' 'HH':'mm':'ss", "dd'/'MM'/'yyyy' 'HH':'mm':'ss"));

            }

        } catch (SQLException ex) {
            Logger.getLogger(ConfermaGenPDF.class.getName()).log(Level.SEVERE, null, ex);
        }

        return res;
    }

    
    /*
     * Aggiorna la tabella vaccinazioni del paziente identificato da id_paziente,
     * indicando che e stato vaccinato il giorno identificato dal parametro data
     */
    private void update_db(String id_paziente, String data) {
        /* recupera i dati del medico che sta effettuando il vaccino dalla sessione. Sono necessari
         * per l'aggiornameno della tabella vaccinazioni
         */
        utente medico = (utente) sessione.getAttribute("user");
        int idMedico = medico.getId();
        try {
            Statement st = (Statement) con.createStatement();
            String comand = "INSERT INTO vaccinazioni (id_medico, id_paziente, data_vaccinazione) VALUES ('" + idMedico + "', '" + id_paziente + "', '" + data + "' );";
            st.executeUpdate(comand);
        } catch (SQLException ex) {
            Logger.getLogger(ConfermaGenPDF.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

     /*
     * Funzione per generare il pdf.
     * 
     */
    private void genera() throws SQLException {
         /*  recupera i dati del medico che sta effettuando il vaccino dalla sessione. */
        Document document = new Document();
        utente medico = null;
        try {
            try {

                String realPath = getServletContext().getRealPath("/pdf");
                medico = (utente) sessione.getAttribute("user");
                int idMedico = medico.getId();
                PdfWriter.getInstance(document, new FileOutputStream(new File(realPath, idMedico + ".pdf")));
            } catch (DocumentException ex) {
                Logger.getLogger(richiamo.class.getName()).log(Level.SEVERE, null, ex);
            }
            document.open();
            
            /*
             * Ogni esecuzione di questo ciclo genera una pagina del pdf relativa a un paziente.
             * I pazienti sono identificati da id_paziente. In ogni pagina sono visualizzati data e 
             * ora della generazione, il nome del pazient, il medico che effettua il richiamo e
             * la lista delle ultime vaccinazioni del paziente, compresa quella corrente. Infatti
             * il database viene aggiornato prima di stampare sul pdf la lista dei vaccini.
             */
            for (int i = 0; i < id_pazienti.length; i++) {  
                DateFormat dataf = new SimpleDateFormat("yyyy'-'MM'-'dd");
                DateFormat oraf = new SimpleDateFormat("HH':'mm':'ss");
                GregorianCalendar gc = new GregorianCalendar();
                String data, ora;
                data = dataf.format(gc.getTime());
                ora = oraf.format(gc.getTime());
                Paragraph apice = new Paragraph();
                apice.add(cambiaPatternData(data, "yyyy'-'MM'-'dd", "dd'/'MM'/'yyyy"));
                apice.add("                                                                                                                          ");
                apice.add(ora);
                document.add(apice);
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                Paragraph titolo = new Paragraph("Lettera per effettuare il richiamo");
                titolo.setAlignment(Paragraph.ALIGN_CENTER);
                document.add(titolo);
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                String medicoVaccinante = medico.getNome() + " " + medico.getCognome();
                document.add(new Paragraph("Caro\\a signor\\a  " + get_nome_cognome(id_pazienti[i]) + ","));
                document.add(new Paragraph("   è gentilmente pregato di presentarsi dal medico dott. " + medicoVaccinante + " per il richiamo della vaccinazione."));
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                ListItem list = new ListItem();
                
                /*aggiornamento del database, con la vaccinazione corrente */
                
                update_db(id_pazienti[i], data + " " + ora);
                
                /* Chiama la funzione che ritorna la lista degli ultimi vaccini */
                
                LinkedList dateVaccini = get_lista_vaccini(id_pazienti[i]);
                list.add("Di seguito sono elencati gli ultimi suoi vaccini effettuati:");
                list.add("\n");
                Iterator iter = dateVaccini.iterator();
                int k = 1;
                while (iter.hasNext()) {
                    list.add("\n" + k++ + ")  " + iter.next());
                }
                document.add(list);
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                document.add(new Paragraph(" "));
                document.add(new Paragraph("La ringraziamo della collaborazione."));
                document.newPage();
            }

        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }

        document.close();
    }

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        sessione = request.getSession();

        PrintWriter out = response.getWriter();
        try {
            ServletContext sc = getServletContext();
            try {
                // genera(sc.getRealPath(request.getServletPath()));
                genera();
            } catch (SQLException ex) {
                Logger.getLogger(ConfermaGenPDF.class.getName()).log(Level.SEVERE, null, ex);
            }
            //una volta generato il pdf redireziona alla welcome, informando l'utente che
            //l'operazione è stata eseguita con sucecsso.
            response.sendRedirect("welcome?msge=PDF genereto con sucesso!");

        } finally {
            out.close();
        }

    }

    protected void processPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            ServletContext sc = getServletContext();
            con = (Connection) sc.getAttribute("con");
            Calendar calendar = new GregorianCalendar();
            DateFormat dataf = new SimpleDateFormat("dd'/'MM'/'yyyy");
            DateFormat oraf = new SimpleDateFormat("HH':'mm':'ss");
            String dataformattata = dataf.format(calendar.getTime());
            String oraformattata = oraf.format(calendar.getTime());
            
            /* recupera la lista dei pazienti da vaccinare  */
            
            id_pazienti = request.getParameterValues("idpaz");         
            out.println("<!DOCTYPE html>  ");
            out.println("<html> ");
            out.println("    <head> ");
            out.println("    </head> ");
            out.println("    <body> ");
            out.println("        <form action=\"ConfermaGenPDF\" method=\"get\">  ");
            out.println("Vuoi confermare i dati selezionati? ");
            out.println("            <table border=1> ");
            out.println("                <tr> ");
            out.println("                    <td bgcolor=\"#DEDFF7\"> ");
            out.println("                    Data: ");
            out.println("                    </td> ");
            out.println("                    <td> ");
            out.println(dataformattata);
            out.println("                    </td> ");
            out.println("                </tr> ");
            out.println("                <tr> ");
            out.println("                    <td bgcolor=\"#DEDFF7\"> ");
            out.println("                    Ora: ");
            out.println("                    </td> ");
            out.println("                    <td> ");
            out.println(oraformattata);
            out.println("                    </td> ");
            out.println("                </tr> ");
            out.println("                <tr> ");
            out.println("                    <td bgcolor=\"#DEDFF7\"> <input type=\"submit\"  value=\"Conferma\"/>");
            out.println("        </form>");
            out.println("                    </td> ");
            out.println("                    <td bgcolor=\"#DEDFF7\"> ");
            out.println("                <form action=\"welcome\" method=\"post\"> ");
            out.println("                      <INPUT TYPE=\"button\" VALUE=\"Tornare\" onClick=\"history.go(-1);\">                         ");
            out.println("                </form> ");
            out.println("                    </td> ");
            out.println("                </tr>");
            out.println("</body> ");
            out.println("</html> ");

        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processGet(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processPost(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
